8皇后算法

Java实现8皇后算法

 1 package com.java;
 2 
 3 /**
 4  * Created by dell on 2018-08-26.
 5  */
 6 public class nQueen {
 7 
 8     /**
 9      八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
10      该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:
11      在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上。
12      问有多少种摆法。
13 
14      思路是按行来规定皇后,第一行放第一个皇后,第二行放第二个,然后通过遍历所有列,来判断下一个皇后能否放在该列。
15      直到所有皇后都放完,或者放哪都不行。
16 
17      第一个皇后先放第一行第一列,然后第二个皇后放在第二行第一列、然后判断是否OK,然后第二列、第三列、依次把所有列都放完,
18      找到一个合适,继续第三个皇后,还是第一列、第二列……
19      直到第8个皇后也能放在一个不冲突的位置,算是找到了一个正确解。
20      然后回头继续第一个皇后放第二列,后面继续循环……
21      */
22 
23     //一共有多少个皇后(此时设置为8皇后在8X8棋盘,可以修改此值来设置N皇后问题)
24     static int max = 8;
25 
26     //该数组保存结果,第一个皇后摆在array[0]列,第二个摆在array[1]列
27     static int[] result = new int[max];
28 
29     static int count=0;
30 
31     public static void main(String[] args) {
32         //N皇后
33         check(0);
34         System.out.println("一共找到:" + count +"种解法");
35     }
36 
37     /**
38      * n代表当前是第几行的皇后
39      * @param n
40      * 皇后n在array[n]列
41      */
42     private static void check(int n) {
43         /*终止条件是最后一个皇后已经摆完,由于每摆一步都会校验是否有冲突,所以只要最后一个摆完,说明已经得到了一个正确解*/
44         //n表示行号
45         if (n==max){
46             //System.out.println(Arrays.toString(result));
47             count++;
48             System.out.println("找到一种解法如下(1-8代表8个皇后的摆放位置):");
49             int[][] A = new int[max][max];
50             for (int i = 0; i < result.length; i++) {
51                 A[i][result[i]]=i+1;
52             }
53             for (int i = 0; i < A.length; i++) {
54                 for (int j = 0; j < A[i].length; j++) {
55                     System.out.print(A[i][j]+"\t");
56                 }
57                 System.out.println();
58             }
59             return;
60         }
61         /*从每行的列开始放值,然后判断是否和本行本列本斜线有冲突,如果OK,就进入下一行的逻辑*/
62         //i表示列的下标号
63         for (int i=0;i<max;i++){
64             result[n]=i;
65             if (judge(n)){
66                 check(n+1);
67             }
68         }
69     }
70     //判断是否和本行本列本斜线有冲突。有冲突返回false;无冲突返回true
71     public static boolean judge(int n){
72         for (int i=0;i<n;i++) {
73             if (result[i]==result[n] || Math.abs(n-i)==Math.abs(result[n]-result[i])){
74                 return false;
75             }
76         }
77         return true;
78     }
79 
80 }

 

posted @ 2018-09-27 10:47  几忆年少红尘客  阅读(394)  评论(0编辑  收藏  举报